package modelo.servicio;

import java.util.List;
import modelo.bd.dao.PasoDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Paso;

public class Pasos {

    private static Pasos instancia;
    private PasoDAO dao;

    private Pasos() {
        this.dao = new PasoDAO();
    }

    public static Pasos instancia() {
        if (instancia == null) {
            instancia = new Pasos();
        }
        return instancia;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar Pasos.");
    }
    
    public void agregar(String claveFlujo, String clavePaso, String descripcion, String descripcionCorta, 
            boolean avisable, String tipoPaso, boolean finalCorrecto, double montoAprobacion, String usuario) throws DAOException {
        Paso paso = new Paso(clavePaso.replace("'", "''"), descripcion.replace("'", "''"),
                descripcionCorta, avisable, tipoPaso, finalCorrecto, montoAprobacion);
        paso.setFlujo(Flujos.instancia().porClave(claveFlujo));
        if (!paso.getFlujo().isValidaMonto()) {
            paso.setMontoAprobacion(0);
        }
        if (descripcionCorta != null) {
            paso.setDescripcionCorta(descripcionCorta.replace("'", "''"));
        }
        dao.add(paso, usuario);
    }

    public void editar(String claveFlujo, String clavePaso, String descripcion, String descripcionCorta, 
            boolean avisable, String tipoPaso, boolean finalCorrecto, double montoAprobacion, String usuario) throws DAOException {
        Paso paso = new Paso(clavePaso.replace("'", "''"), descripcion.replace("'", "''"),
                descripcionCorta, avisable, tipoPaso, finalCorrecto, montoAprobacion);
        paso.setFlujo(Flujos.instancia().porClave(claveFlujo));
        if (!paso.getFlujo().isValidaMonto()) {
            paso.setMontoAprobacion(0);
        }
        if (descripcionCorta != null) {
            paso.setDescripcionCorta(descripcionCorta.replace("'", "''"));
        }
        dao.update(paso, usuario);
    }

    public void eliminar(String claveFlujo, String clavePaso, String usuario) throws DAOException {
        dao.deleteWhere("pafl_clave      = '" + clavePaso.replace("'", "''") + "' \n"
                  + "AND pafl_fluj_clave = '" + claveFlujo.replace("'", "''") + "'");
//        modelo.dominio.Flujo f = Flujos.instancia().porClave(claveFlujo);
//        Flujos.instancia().editar(f.getClave(), f.getDescripcion(),
//                f.getDescripcionCorta(), "N", f.getComentarios(), f.isValidaMonto(), usuario);
    }
    
    public List<Paso> todos() throws DAOException {
        return dao.selectAll();
    }
    
    public Paso porClave(String claveFlujo, String clavePaso) {
        try {
            List<Paso> ls = dao.selectWhere("pafl_clave = '" + clavePaso.replace("'", "''") + "' \n"
                    + "AND pafl_fluj_clave = '" + claveFlujo.replace("'", "''") + "'");
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }
    
    public List<Paso> delFlujo(String claveFlujo) throws DAOException {
        return dao.selectWhere("pafl_fluj_clave = '" + claveFlujo.replace("'", "''") + "' ");
    }
}
